#coding:utf-8
'''
create on 2017-04-20

@author: sandy
'''
import sys,platform
sys.path.append("../")
from twisted.internet import reactor
from pycommon import Daemon
from pycommon import Const
from pycommon import LogManager
from pycommon import RedisDb
from pycommon import Pack
from pycommon import Utils
from pycommon import RemoteManager
import logging
import ClientFactory
import Center
import ServerConfig
import CounterManager


if 'twisted.internet.reactor' not in sys.modules: 
    if platform.system() == "Linux":
        from twisted.internet import epollreactor
        epollreactor.install()  
    else:
        from twisted.internet import iocpreactor
        iocpreactor.install()


def ServerStart(isdaemon):
    logging.info("############Start GateServer############")
    CounterManager.instance.start(Const.COUNTER_GATE2CENTER_INTERVAL)
    RedisDb.instance.start(ServerConfig.instance.redisdb_ip,ServerConfig.instance.redisdb_port,ServerConfig.instance.redisdb_db,ServerConfig.instance.redisdb_passwd)
    ClientFactory.instance.start(ServerConfig.instance.server_ip,ServerConfig.instance.server_port,ServerConfig.instance.max_client)
    Center.instance.start(ServerConfig.instance.center_ip,ServerConfig.instance.center_port)
    
def ServerStop():
    Center.instance.stop();
    ClientFactory.instance.stop();
    RedisDb.instance.stop()

def getConfig(isdaemon):
    configlist = RemoteManager.instance.getConfigList()
    RemoteManager.instance.requestConfig(configlist,ServerStart,isdaemon)
    pass

def getServerConfig(isdaemon):
    configlist = [u'server%d.*' % RemoteManager.instance.sid]
    RemoteManager.instance.addConfigCallback(ServerConfig.instance)
    RemoteManager.instance.requestConfig(configlist,getConfig,isdaemon)

def daemonFunc(isdaemon):
    LogManager.instance.setupLog(RemoteManager.instance.loglevel,RemoteManager.instance.logfile,isdaemon)
    logging.info("############Update GateServer Config############")
    RemoteManager.instance.start(getServerConfig,isdaemon)
    reactor.run()
    ServerStop()

def run():
    sid, msip, msport, pidpath, logfile, loglevel, pathSelfConfig = Utils.loadDaemonConfig(ServerConfig.instance.rundir)
    RemoteManager.instance.init(sid,msip,msport,logfile, loglevel)
    Daemon.run(pidpath, daemonFunc)

if __name__ == "__main__":
    run()